package com.dankegongyu.lib.common.util;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

/**
 * @author wpq
 * @version 1.0
 */
public class TypeUtil {

    private TypeUtil() {
        throw new AssertionError("cannot be instantiated");
    }

    /**
     * 获取某个类的父类上的泛型信息并创建实例
     *
     * @param o 当前类（这里一般为子类）
     * @param index 泛型下标
     * @param <T> 泛型
     * @return 泛型实例
     */
    public static <T> T getT(Object o, int index) {
        try {
            Type genType = o.getClass().getGenericSuperclass();
            Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
            @SuppressWarnings("unchecked")
            Class<T> childClass = (Class<T>)params[index];
            return childClass.newInstance();

            // noinspection unchecked
//            return ((Class<T>) ((ParameterizedType) (o.getClass().getGenericSuperclass())).getActualTypeArguments()[index]).newInstance();
        } catch (Exception e) {
//            e.printStackTrace();
        }

        return null;
    }

}
